// 数组扁平化

let a = [11, [1,2], [[3,4],[5,6]] , [77, 88] , 99 ];
console.log( a );

// Array.prototype.flat( [depth] )
// 参数: depth 用于指定要提取嵌套数组的结构深度，默认值为 1
// 作用: 按照一个可指定的深度递归遍历数组，
//      并将所有元素与遍历到的子数组中的元素合并为一个新数组返回
// 返回: 一个包含将数组与子数组中所有元素的新数组
let b = a.flat();
console.log( b );

let c = a.flat(2);
console.log( c );

console.log( '- '.repeat(30) );

let odds = [ 1, 3, 5, 7, 9 ];

// Array.prototype.map( callback [, thisArg] )
// 参数: callback 必须是个函数，其参数依次是 element 、index 、array
// 作用: 将原数组中各元素用callback处理后的结果映射到新数组中
// 返回: 返回一个包含了每个元素对应的callback处理结果的新数组
let res = odds.map( e => e ** 2 );
console.log( res );


const arr = [1, 2, [3], [4,5], 6, []];
console.log( arr );

// Array.prototype.flatMap( fn [, thisArg] )
// 作用: 首先使用映射函数(fn)映射每个元素，然后将结果压缩成一个新数组
// 返回: 一个新的数组，其中每个元素都是回调函数的结果，并且结构深度 depth 值为 1
const flattened = arr.flatMap( e => e ** 2 );
console.log(flattened);

console.log( [[0]] == 0 ); // true
console.log( [[0]] === 0 ); // false

// 总结:
// Array.prototype.flat( [depth] ) 用于实现数组扁平化
// Array.prototype.map( fn [, thisArg] ) 返回用fn依次处理各元素后的结果组成的新数组
// Array.prototype.flatMap( fn [, thisArg] ) 返回用映射函数(fn)映射每个元素的结果组成的新数组